home *** CD-ROM | disk | FTP | other *** search
/ Mac Easy 2010 May / Mac Life Ubuntu.iso / casper / filesystem.squashfs / usr / src / linux-headers-2.6.28-15 / include / linux / cpu.h < prev    next >
Encoding:
C/C++ Source or Header  |  2008-12-24  |  4.1 KB  |  155 lines

  1. /*
  2.  * include/linux/cpu.h - generic cpu definition
  3.  *
  4.  * This is mainly for topological representation. We define the 
  5.  * basic 'struct cpu' here, which can be embedded in per-arch 
  6.  * definitions of processors.
  7.  *
  8.  * Basic handling of the devices is done in drivers/base/cpu.c
  9.  * and system devices are handled in drivers/base/sys.c. 
  10.  *
  11.  * CPUs are exported via sysfs in the class/cpu/devices/
  12.  * directory. 
  13.  *
  14.  * Per-cpu interfaces can be implemented using a struct device_interface. 
  15.  * See the following for how to do this: 
  16.  * - drivers/base/intf.c 
  17.  * - Documentation/driver-model/interface.txt
  18.  */
  19. #ifndef _LINUX_CPU_H_
  20. #define _LINUX_CPU_H_
  21.  
  22. #include <linux/sysdev.h>
  23. #include <linux/node.h>
  24. #include <linux/compiler.h>
  25. #include <linux/cpumask.h>
  26. #include <linux/mutex.h>
  27.  
  28. struct cpu {
  29.     int node_id;        /* The node which contains the CPU */
  30.     int hotpluggable;    /* creates sysfs control file if hotpluggable */
  31.     struct sys_device sysdev;
  32. };
  33.  
  34. extern int register_cpu(struct cpu *cpu, int num);
  35. extern struct sys_device *get_cpu_sysdev(unsigned cpu);
  36.  
  37. extern int cpu_add_sysdev_attr(struct sysdev_attribute *attr);
  38. extern void cpu_remove_sysdev_attr(struct sysdev_attribute *attr);
  39.  
  40. extern int cpu_add_sysdev_attr_group(struct attribute_group *attrs);
  41. extern void cpu_remove_sysdev_attr_group(struct attribute_group *attrs);
  42.  
  43. extern int sched_create_sysfs_power_savings_entries(struct sysdev_class *cls);
  44.  
  45. #ifdef CONFIG_HOTPLUG_CPU
  46. extern void unregister_cpu(struct cpu *cpu);
  47. #endif
  48. struct notifier_block;
  49.  
  50. #ifdef CONFIG_SMP
  51. /* Need to know about CPUs going up/down? */
  52. #ifdef CONFIG_HOTPLUG_CPU
  53. extern int register_cpu_notifier(struct notifier_block *nb);
  54. extern void unregister_cpu_notifier(struct notifier_block *nb);
  55. #else
  56.  
  57. #ifndef MODULE
  58. extern int register_cpu_notifier(struct notifier_block *nb);
  59. #else
  60. static inline int register_cpu_notifier(struct notifier_block *nb)
  61. {
  62.     return 0;
  63. }
  64. #endif
  65.  
  66. static inline void unregister_cpu_notifier(struct notifier_block *nb)
  67. {
  68. }
  69. #endif
  70.  
  71. int cpu_up(unsigned int cpu);
  72. void notify_cpu_starting(unsigned int cpu);
  73. extern void cpu_hotplug_init(void);
  74. extern void cpu_maps_update_begin(void);
  75. extern void cpu_maps_update_done(void);
  76.  
  77. #else    /* CONFIG_SMP */
  78.  
  79. static inline int register_cpu_notifier(struct notifier_block *nb)
  80. {
  81.     return 0;
  82. }
  83.  
  84. static inline void unregister_cpu_notifier(struct notifier_block *nb)
  85. {
  86. }
  87.  
  88. static inline void cpu_hotplug_init(void)
  89. {
  90. }
  91.  
  92. static inline void cpu_maps_update_begin(void)
  93. {
  94. }
  95.  
  96. static inline void cpu_maps_update_done(void)
  97. {
  98. }
  99.  
  100. #endif /* CONFIG_SMP */
  101. extern struct sysdev_class cpu_sysdev_class;
  102.  
  103. #ifdef CONFIG_HOTPLUG_CPU
  104. /* Stop CPUs going up and down. */
  105.  
  106. static inline void cpuhotplug_mutex_lock(struct mutex *cpu_hp_mutex)
  107. {
  108.     mutex_lock(cpu_hp_mutex);
  109. }
  110.  
  111. static inline void cpuhotplug_mutex_unlock(struct mutex *cpu_hp_mutex)
  112. {
  113.     mutex_unlock(cpu_hp_mutex);
  114. }
  115.  
  116. extern void get_online_cpus(void);
  117. extern void put_online_cpus(void);
  118. #define hotcpu_notifier(fn, pri) {                \
  119.     static struct notifier_block fn##_nb __cpuinitdata =    \
  120.         { .notifier_call = fn, .priority = pri };    \
  121.     register_cpu_notifier(&fn##_nb);            \
  122. }
  123. #define register_hotcpu_notifier(nb)    register_cpu_notifier(nb)
  124. #define unregister_hotcpu_notifier(nb)    unregister_cpu_notifier(nb)
  125. int cpu_down(unsigned int cpu);
  126.  
  127. #else        /* CONFIG_HOTPLUG_CPU */
  128.  
  129. static inline void cpuhotplug_mutex_lock(struct mutex *cpu_hp_mutex)
  130. { }
  131. static inline void cpuhotplug_mutex_unlock(struct mutex *cpu_hp_mutex)
  132. { }
  133.  
  134. #define get_online_cpus()    do { } while (0)
  135. #define put_online_cpus()    do { } while (0)
  136. #define hotcpu_notifier(fn, pri)    do { (void)(fn); } while (0)
  137. /* These aren't inline functions due to a GCC bug. */
  138. #define register_hotcpu_notifier(nb)    ({ (void)(nb); 0; })
  139. #define unregister_hotcpu_notifier(nb)    ({ (void)(nb); })
  140. #endif        /* CONFIG_HOTPLUG_CPU */
  141.  
  142. #ifdef CONFIG_PM_SLEEP_SMP
  143. extern int suspend_cpu_hotplug;
  144.  
  145. extern int disable_nonboot_cpus(void);
  146. extern void enable_nonboot_cpus(void);
  147. #else /* !CONFIG_PM_SLEEP_SMP */
  148. #define suspend_cpu_hotplug    0
  149.  
  150. static inline int disable_nonboot_cpus(void) { return 0; }
  151. static inline void enable_nonboot_cpus(void) {}
  152. #endif /* !CONFIG_PM_SLEEP_SMP */
  153.  
  154. #endif /* _LINUX_CPU_H_ */
  155.